/*
在npm官网搜索: koa
语法: npm i koa

什么是框架 frame: (1)封装原生代码的 API    (2)规范流程和格式    (3)让开发人员更加关注于业务代码，提高开发效率

框架frame和库lib的区别:(1)框架是唯一的,库就可以共存    (2)框架关注全流程,库关注单个功能

koa2 是 nodejs web server 框架;通过 async/await 语法高效编写 web server; 中间件机制,能合理拆分业务代码

使用脚手架 koa-generator 创建 koa2 项目;入口文件 app.js

koa2 处理 http 请求: ctx 即 res 和 req 的集合
        querystring 和 Request body;  Response body 和 Content-type

什么是中间件:一个流程上,独立的业务模块; 可扩展,可插拔

为什么使用中间件:(1)拆分业务模块,使代码清晰 (2)统一使用中间件,使得各业务代码都规范标准 (3)扩展性好,易添加、易删除

koa2洋葱圈模型:(1)每个中间件都是 async 函数    (2)中间件的运行机制,就像洋葱圈

 */

const Koa = require('koa')
const app = new Koa()



// logger
app.use(async (ctx, next) => {
    ctx.cookies.set('userId', '123') // 设置 cookie
    await next() // 执行下一个中间件
    const rt = ctx.response.get('X-Response-Time') // 获取 时间差
    console.log(`${ctx.method} ${ctx.url} - ${rt}`)
})

// x-response-time
app.use(async (ctx, next) => {
    const start = Date.now()
    await next() // 执行下一个中间件
    const ms = Date.now() - start // 计算时间差，例如 80
    ctx.set('X-Response-Time', `${ms}ms`) // 记录/设置 时间差
})


// 模拟 session
const SESSION_DATA = {
    '123': {
        user: 'zhangsan', age: 20
    },
    '456': {
        user: 'lisi'
    },
    '789': {
        user: 'shuangyue'
    }
}


app.use(async (ctx) => {

    // 获取 cookie
    const userId = ctx.cookies.get('userId')
    const user_name = SESSION_DATA[userId]
    ctx.body = 'cookie test by Koa2; user_name ='+user_name.user
})

app.listen(3000)
console.log('http 请求已经被监听;请访问 http://localhost:3000')

